package main

import (
	"bytes"
	"fmt"
	"regexp"
)

func main() {
	//"p([a-z]+)ch"
	//它的意思是匹配以 "p" 开头，然后是一个或多个小写字母，最后以 "ch" 结尾的字符串。
	match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
	fmt.Println(match)

	//上面我们是直接使用字符串，但是对于一些其他的正则任务
	//你需要通过 Compile 得到一个优化过的 Regexp 结构体。
	r, _ := regexp.Compile("p([a-z]+)ch")

	fmt.Println(r.MatchString("peach"))
	//查找匹配的字符串
	fmt.Println(r.FindString("peach punch"))
	//查找首次匹配的字符串，返回值是汽配的开始和结束位置
	fmt.Println("idx: ", r.FindStringIndex("peach punch"))
	//submatch返回完全匹配和局部匹配的字符串  例如，这里会返回匹配 p([a-z]+)ch 和 ([a-z]+) 的信息。
	fmt.Println(r.FindStringSubmatch("peach punch"))
	//返回完全匹配和局部匹配的索引
	fmt.Println(r.FindStringSubmatchIndex("peach punch"))

	//返回全部匹配项，不仅仅是首次匹配项
	//第一个参数是要进行匹配的输入字符串，第二个参数是指定最大匹配次数 (负数为无限制)
	fmt.Println(r.FindAllString("peach punch pinch", -1))
	fmt.Println("all: ", r.FindAllStringSubmatchIndex("peach punch pinch", -1))
	fmt.Println(r.FindAllString("peach punch pinch", 2))

	fmt.Println(r.Match([]byte("peach")))

	//创建正则表达式的全局变量时，可以使用 Compile 的变体 MustCompile 。
	//MustCompile 用 panic 代替返回一个错误 ，这样使用全局变量更加安全
	r = regexp.MustCompile("p([a-z]+)ch")
	fmt.Println("regexp: ", r)
	fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))

	// Func 变体允许您使用给定的函数来转换匹配的文本。
	in := []byte("a peach")
	out := r.ReplaceAllFunc(in, bytes.ToUpper)
	fmt.Println(string(out))
}
